package com.hqd.ch03.v17.aop;

import com.hqd.ch03.v17.aopalliance.intercept.MethodInvocation;

import javax.annotation.Nullable;

public interface ProxyMethodInvocation extends MethodInvocation {
    /**
     * 获取代理对象
     *
     * @return
     */
    Object getProxy();

    /**
     * 复制对象
     *
     * @return
     */
    MethodInvocation invocableClone();

    /**
     * 复制参数
     *
     * @param arguments
     * @return
     */
    MethodInvocation invocableClone(Object... arguments);

    /**
     * 设置参数
     *
     * @param arguments
     */
    void setArguments(Object... arguments);

    /**
     * 设置调用链共享数据
     *
     * @param key
     * @param value
     */
    void setUserAttribute(String key, @Nullable Object value);

    @Nullable
    Object getUserAttribute(String key);
}
